/**
 * 给定一个排列，每个元素有一个颜色。
 * 要求每次交换只能交换颜色不同的两个元素
 * 问最少多少次交换可以使得排列有序
 * 最少次数，所以肯定考虑按照置换考虑
 * 假设某个置换含有不同颜色的元素，
 * 则每一步肯定能够选择元素落入正确的位置
 * 直到最后一个元素自然正确，因此需要size()-1步操作
 * 如果是同色，则只要存在异色，就可以先交换一个异色进来
 * 然后用sz-1步完成剩下的，然后再把异色交换出去，因此需要size()+1步
 * 但是存在特殊情况，假设存在A和B两个相异的同色置换，
 * 则首先交换Ai和Bj，随后用A.size() - 1 和 B.size() - 1 步完成其余元素
 * 再把Ai和Bj交换回去，此时它们自然就归位了，因此一共需要 A.size() + B.size() 次操作。
 * 也就是说可以节约2次操作
 * 因此统计这样的对数，减去即可
 * 如果全部同色初始又没有归位，就是无解。
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;

template<typename T>
void input(vector<T> & v, int n){
	v.assign(n + 1, {});
	for(int i=1;i<=n;++i) cin >> v[i];
	return;
}

int N;
vi A;
string S;
vector<vi> Loop;
vi Flag;
int proc(){
    bool same = true;
    bool good = true;
    for(int i=1;i<=N;++i){
        if(A[i] != i) good = false;
        if(i > 1 and S[i - 1] != S[i]) same = false;
    }
    if(good) return 0;
    if(same) return -1;

    Loop.clear();
    Flag.assign(N + 1, 0);
    for(int i=1;i<=N;++i){
        if(Flag[i]) continue;
        Flag[i] = 1;
        Loop.emplace_back(vi());
        auto & v = Loop.back();
        v.emplace_back(i);
        while(0 == Flag[A[v.back()]]){
            v.emplace_back(A[v.back()]);
            Flag[v.back()] = 1;
        }
    }

    int ans = 0;
    int rcnt = 0, wcnt = 0;
    for(const auto & v : Loop){
        if(v.size() == 1) continue;
        bool same = true;
        for(int i=1;i<v.size();++i){
            if(S[v[i - 1]] != S[v[i]]){
                same = false; break;
            }
        }
        if(same){
            ans += v.size() + 1;
            if(S[v[0]] == 'R') rcnt += 1;
            else wcnt += 1;
        }else{
            ans += v.size() - 1;
        } 
    }
    ans -= 2 * min(rcnt, wcnt);
    return ans;
}

void work(){
    cin >> N;
	input(A, N);
    cin >> S;
    S = " " + S;
    cout << proc() << "\n";
	return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int nofkase = 1;
    // cin >> nofkase;
    while(nofkase--) work();
    return 0;
}